package com.gxa.park.core.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;


/**
 * @author Min
 */
public class JWTUtil {
    /**
     * 设置过期时间
     */
    private static final long  EXPIRE_TIME=30*60*1000;
    public static final String TOKEN_MESSAGE_BODY="phone";

    /**
     *     签发生成 jwt
     */
    public static String sign(String body){
        // 将时间常量转换成时间格式
        Date time=new Date(System.currentTimeMillis()+EXPIRE_TIME);

        // 使用手机号作为加密生成私钥
        Algorithm algorithm = Algorithm.HMAC256(body);

        // 生成 jwt
        String auth = JWT.create().withClaim(TOKEN_MESSAGE_BODY,body).withExpiresAt(time).sign(algorithm);

        return auth;

    }

    /**
     * 获得token中的信息无需secret解密也可直接获取
     * @return jwt中声明的手机号
     */
    public static String getTokenMessageBody(String token) {
// 从token中解密得到jwt中的载荷信息
// 得到一个可以读取jwt中的信息的调用对象:DecodedJWT
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim(TOKEN_MESSAGE_BODY).asString();
    }

    /**
     * 校验jwt是否正确
     * @param token 需要校验的jwt字符串
     * @return 返回验证结果
     */
    public static boolean verify(String token, String phone) {
        try {
    //根据密码生成JWT私钥校验器
    // 普通管理员和超级管理员,都采用手机号后六位加密
            Algorithm algorithm = Algorithm.HMAC256(phone.substring(5));
    //校验环节
    // 生成一个校验器
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim(TOKEN_MESSAGE_BODY, phone)
                    .build();
    //效验JWT: 通过异常来确定是否校验成功
            DecodedJWT decodedJWT = verifier.verify(token);
    // 测试一下jwt验证后生成的状态
    // System.out.println(decodedJWT);
            return true;
        } catch (Exception exception) {
            return false;
        }
    }
}
